﻿#ifndef MOTIONCONTROLLER_H
#define MOTIONCONTROLLER_H

#include <QObject>

const unsigned short AXIS_X = 0;
const unsigned short AXIS_Y = 1;
const unsigned short AXIS_Z = 2;
const unsigned short AXIS_W = 3;

/// 运动控制卡的纯虚接口，规范了运动控制卡的几种基本功能。
class MotionController : public QObject
{
public:
    MotionController(QObject *parent = 0):QObject(parent) {}

    /**
     * @brief init  初始化运动控制卡
     */
    virtual void init() = 0;
    /**
     *  \brief 设置电机运行速度
     *  \param [in] axis 指定轴
     *  \param [in] speed 轴的运动速度，单位 Hz
     */
    virtual void setSpeed(unsigned short axis, int speed) = 0;

    virtual void goHome(unsigned short axis, int speed) = 0;

    /**
     * @brief setAcceleration 设置电机的运行加速度
     * @param axis 指定轴
     * @param acceleration 轴的运动加速度
     */
    virtual void setAcceleration(unsigned short axis, int acceleration) = 0;

    /**
     * @brief setDeceleration 设置电机停止前的减速度
     * @param axis 指定轴
     * @param deceleration 轴的运动减速度
     */
    virtual void setDeceleration(unsigned short axis, int deceleration) = 0;

    /**
     *  \brief 运动电机到指定位置
     *  \param [in] axis 指定要运动的轴
     *  \param [in] position 要运动到的位置，对应控制卡内部脉冲计数
     *
     */
    virtual void moveTo(unsigned short axis, int position) = 0;
    //virtual void moveToRel(unsigned short axis, int position) = 0;
    /**
     *  \brief 使得电机朝某个指定方向运动
     *  \param [in] axis 指定要运动的轴
     *  \param [in] dir 要运动的方向，1 表示正转，-1 表示反转
     */
    virtual void move(unsigned short axis, int dir = 1) = 0;

    /**
     *  \brief 电机转动 steps 步
     *  \param [in] axis 指定要运动的轴
     *  \param [in] steps 转动的步数，大于 0 表示正转，小于 0 表示反转
     */
    virtual void moveSteps(unsigned short axis, int steps) = 0;

    /**
     * @brief stop 停止电机运动
     * @param axis 指定轴
     */
    virtual void stop(unsigned short axis) = 0;

    /**
     * @brief abort 急停，停止所有轴的运动
     */
    virtual void abort() = 0;

    /**
     *  \brief 读取控制卡内部电机步数计数器的数值
     *  \param [in] axis 指定轴
     *  \return 计数器的数值
     */
    virtual int readTheoryPos(unsigned short axis) = 0;

    /**
     * @brief readTheoryPosAll 读取控制卡内部电机步数计数器的数值
     * @param value 返回四个轴的数值
     */
    virtual bool readTheoryPosAll(int *value) = 0;
    /**
     *  \brief 读取控制卡内部编码器反馈计数器的数值
     *  \param [in] axis 指定轴
     *  \return 计数器的数值
     */
    virtual int readEncodePos(unsigned short axis) = 0;

    /**
     *  \brief 读取控制卡通用输入IO的状态
     *  \param value 返回八个输入的状态
     *  \return
     */
    virtual bool readIO(bool *value) = 0;

    /**
     * @brief readEncodePosAll 读取控制卡内部编码器反馈计数器的数值
     * @param value 返回四个轴的数值
     */
    virtual bool readEncodePosAll(int *value) = 0;

    /**
     * @brief setStartSpeed 设置起跳速度
     * @param axis
     * @param startSpeed
     */
    virtual void setStartSpeed(unsigned short axis, int startSpeed) = 0;

    /**
     * @brief setStopSpeed 设置停止前的最后速度
     * @param axis
     * @param stopSpeed
     */
    virtual void setStopSpeed(unsigned short axis, int stopSpeed) = 0;

    /**
     * @brief setTheoryPos 设置控制卡内部电机步数计数器的计数值
     * @param axis
     * @param offset
     */
    virtual void setTheoryPos(unsigned short axis, long offset) = 0;

    /**
     * @brief setEncoderPos 设置控制卡内部编码器计数器的计数值
     * @param axis
     * @param offset
     */
    virtual void setEncoderPos(unsigned short axis, long offset) = 0;

    /**
     * @brief isMoving 判断一个轴是否在运动。
     * @param axis
     * @return true 表示正在运动中
     */
    virtual bool isMoving(unsigned short axis) = 0;
};

#endif // MOTIONCONTROLLER_H
